package main

import "fmt"

func main() {
	member := Member{
		Id:   2,
		Name: "haha",
	}
	(&member).setName("lala")
	member.printName()
	//fmt.Println(member.String())

	//Id2 := member.Id2()
	//fmt.Println(Id2)
	//fmt.Println(member.Id)
}

/*
  方法调用：声明方法后，可以被接受者结构体的任意一个实例直接调用，其余和函数一样【其实就是对等Java的成员方法，方法集就是一组相同数据类型的方法】
  函数调用：参数为结构体时，与结构体是强依赖的（当然其他参数一样），即所有需要使用函数和结构体的地方都必须包含函数与结构体的定义
*/
func testF() {
	member := Member{
		Id:   1,
		Name: "wang",
	}
	member2 := Member{
		Id:   1,
		Name: "xiao",
	}
	member.printName()
	member2.printName()

	printName(&member)
}

func testF2() {
	member := Member{
		Name: "lala",
	}
	member.setName("2")
	//lala  不会修改原有值
	fmt.Println(member.Name)
}

type Member struct {
	Id   int
	Name string
}

func printName(member *Member) {
	fmt.Println(member.Name)
}

/**
方法在func后多了一个返回类型，其实就相当于Java类中的this指针，Java成员函数编译后的代码其实也是这样，只不过go更直观地表达出来了
 只有需要修改对象本身时，才设为指针传递，即下面的m *Member
*/
func (m *Member) printName2() {
	m.Name = "1"
}
func (m Member) printName() {
	fmt.Println(m.Name)
}

func (m *Member) Id2() int {
	m.Id = m.Id * 2
	return m.Id
}

/**
  返回类型为值类型的方法
*/
func (m Member) setName(Name string) {
	m.Name = Name
}

func (m *Member) setNameR(Name string) {
	m.Name = Name
}

func (m *Member) String() string {
	return fmt.Sprintf("id=%v,name=%v", m.Id, m.Name)
}
